VB - Delphi
Otázka od: Jozef Baranec
6. 11. 2002 12:48
Vo Visual Basic mozem zapisat toto:
For each x in y
...
next
Da sa to nejako zapisat aj v Delphi?
Dik
jozo
Odpovedá: Tomas Bihary
6. 11. 2002 12:42
Ne,
jedine takhle:
for I := {DOLNI_INDEX} to {HORNI_INDEX} do
begin
X := Y[I]; // POLOZKA DLE INDEXU
...
end;
Ahoj Tomas
----- Original Message -----
Vo Visual Basic mozem zapisat toto:
For each x in y
...
next
Da sa to nejako zapisat aj v Delphi?
Odpovedá: Ondrej Kelle
6. 11. 2002 13:02
>> For each x in y
>> ...
>> next
>>
>> Da sa to nejako zapisat aj v Delphi?
VBA Collection je objekt, ktory ma metody Count a Item, mozes teda vo for
cykle pouzit metodu Item(X). Pozor, prvy element ma index 1.
Priklad: v OleContainer1 mam vlozeny Word objekt s niekolkymi odstavcami
textu. Nasledovny kod mi zarovna vsetky odstavce doprava:
var
Document, Collection: Variant;
I: Integer;
begin
Document := OleContainer1.OleObject;
Collection := Document.Paragraphs;
for I := 0 to Collection.Count - 1 do
Collection.Item(I + 1).Alignment := 2;
end;
HTH
TOndrej
Odpovedá: Martin Schayna
6. 11. 2002 15:42
----- Original Message -----
From: "Jozef Baranec" <joba@digitaldocuments.org>
> Vo Visual Basic mozem zapisat toto:
>
> For each x in y
> ...
> next
>
> Da sa to nejako zapisat aj v Delphi?
Pokud je k dispozici v interfacu objektu kolekce indexovana
property Items nebo podobne, muzes je prochazet normalne.
Pokud tam je pouze metoda _NewEnum (s pevne danym DispID
-4), pak to lze pomoci tzv. enumeratoru ktery tato metoda
vraci. Prave tu pouziva VB pro konstrukci For...Each.
Metoda _NewEnum vraci IUnkown interface, ze ktereho se dostanes
na skutecny interface enumeratoru, mam vyzkousene ze vetsinou
funguje interface IEnumVariant deklarovany v ActiveX.pas s metodami
Next, Skip, Reset a Clone. Mozna funguji obcas i jine podobne interfacy
s podobnymi metodami urcene pro enumerovani ruznych jinych typu
(IEnumString...), ale vyzkousene to nemam.
Pak uz staci projit kolekci pomoci volani metody Next na enumeratoru.
Odkazuji na MSDN, z pameti pisu nasledujici kod ale nemusi byt
uplne dobre:
var
mEnum: IEnumVariant;
mVar: OleVariant
n: Integer;
begin
mEnum := obj._NewEnum as IEnumVariant;
OLECheck(mEnum.Next(1, mVar, n));
while (n > 0) do begin
//v mVar k dispozici IDispatch na objekt v kolekci
OLECheck(mEnum.Next(1, mVar, n));
end;
end;
Martin Schayna
Odpovedá: Jozef Baranec
6. 11. 2002 22:41
Dik pomohlo to ...
jozo
----
var
mEnum: IEnumVariant;
mVar: OleVariant
n: Integer;
begin
mEnum := obj._NewEnum as IEnumVariant;
OLECheck(mEnum.Next(1, mVar, n));
while (n > 0) do begin
//v mVar k dispozici IDispatch na objekt v kolekci
OLECheck(mEnum.Next(1, mVar, n));
end;
end;
Martin Schayna